package models

import (
	"gorm.io/gorm" // GORM ORM框架，用于数据库操作
)

// Problem 问题模型结构，定义题目相关的数据字段和关系
type Problem struct {
	Base                                 // Base 嵌入基础模型，包含通用字段
	Identity          string             `gorm:"column:identity;type:varchar(36);" json:"identity"`   // Identity 问题的唯一标识，使用varchar(36)类型存储
	Title             string             `gorm:"column:title;type:varchar(255);" json:"title"`        // Title 问题标题，使用varchar(255)类型存储
	Content           string             `gorm:"column:content;type:text;" json:"content"`            // Content 问题描述内容，使用text类型存储
	MaxRuntime        int                `gorm:"column:max_runtime;type:int(11);" json:"max_runtime"` // MaxRuntime 题目允许的最大运行时长（毫秒），使用int(11)类型存储
	MaxMem            int                `gorm:"column:max_mem;type:int(11);" json:"max_mem"`         // MaxMem 题目允许的最大运行内存（MB），使用int(11)类型存储
	ProblemCategories []*ProblemCategory `gorm:"foreignKey:problem_id;references:id"`                 //关联问题分类
	TestCases         []*TestCase        `gorm:"foreignKey:problem_identity;references:identity"`     // 关联测试用例表
}

// TableName 指定Problem模型对应的数据库表名
func (table *Problem) TableName() string {
	return "problem" // 返回数据库表名
}

// GetProblemList 根据关键词获取问题列表查询构建器
func GetProblemList(keyword string, categoryId string) *gorm.DB {
	// 创建查询构建器，设置基础查询模型为Problem 预加载问题关联的分类信息（避免N+1查询）
	tx := DB.Model(&Problem{}).Preload("ProblemCategories.Category").Where(
		"title like ? OR content like ?", // SQL条件：标题或内容包含关键词
		"%"+keyword+"%", "%"+keyword+"%", // 参数：为两个占位符填充带通配符的关键词
	)

	// 如果提供了分类ID，则添加分类筛选条件
	if categoryId != "" {
		// 使用RIGHT JOIN连接问题分类表，筛选特定分类的问题
		tx.Joins("RIGHT JOIN problem_category pc on pc.problem_id=problem.id").
			Where("pc.category_id=(SELECT cb.id FROM category cb WHERE cb.id=?)", categoryId) // 子查询确保分类ID存在
	}
	return tx // 返回构建好的查询构建器
}
